-- KEYS[1]: 锁的键名
-- ARGV[1]: 线程ID
-- ARGV[2]: 锁超时时间(秒)
-- 返回值: -1=锁不存在或不属于当前线程, 0=重入锁释放但锁仍存在, 1=锁完全释放

local key = KEYS[1]
local threadId = ARGV[1]
local timeout = tonumber(ARGV[2]) or 30

if redis.call('hexists', key, threadId) == 0 then
    return -1
end

local count = redis.call('hincrby', key, threadId, -1)
if count > 0 then
    redis.call('expire', key, timeout)
    return count  -- 返回剩余计数
else
    redis.call('del', key)
    return 0  -- 锁完全释放
end
